package com.sloth.bear.util;

import com.sloth.bear.dto.entity.FileIndex;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 刮削工具类 - 用于从网络获取视频元数据
 */
@Slf4j
public class ScraperParse {

    /**
     * 解析视频文件名并刮削元数据
     *
     * @param name 文件名
     * @param fileIndex 文件索引对象（会更新其元数据字段）
     */
    public static void parse(String name, FileIndex fileIndex) {
        log.info("开始刮削文件：{}", name);
        List<String> nameList = Collections.emptyList();
        try {
            // 清理文件名
            String uri = name.replace(".mp4", "")
                    .replaceAll("(?i).h265", "")
                    .replaceAll("(?i).mkv", "")
                    .replaceAll("(?i).avi", "")
                    .toLowerCase();

            if (uri.contains("@")) {
                uri = uri.split("@")[1];
            }
            if (uri.contains("_")) {
                uri = uri.split("_")[0];
            }
            if (uri.contains(" ")) {
                uri = uri.split(" ")[0];
            }

            nameList = new ArrayList<>(Arrays.asList(uri.split("-")));
            if (nameList.size() < 2) {
                log.warn("文件名格式不符合刮削规则：{}", name);
                return;
            }

            // 尝试多种格式进行刮削
            htmlParse(String.join("00", nameList.subList(0, 2)), fileIndex);
        } catch (Exception e) {
            try {
                htmlParse(String.join("-", nameList.subList(0, 2)), fileIndex);
            } catch (Exception e1) {
                try {
                    htmlParse("1" + String.join("00", nameList.subList(0, 2)), fileIndex);
                } catch (Exception e2) {
                    log.error("刮削失败，name={}, cause={}", name, e2.getMessage());
                }
            }
        }
    }

    /**
     * 从网站获取视频元数据
     *
     * @param uri 视频编号
     * @param fileIndex 文件索引对象
     * @throws IOException 网络请求异常
     */
    private static void htmlParse(String uri, FileIndex fileIndex) throws IOException {
        String url = "https://www.jav321.com/video/" + uri;
        log.info("刮削URL: {}", url);

        // 注意：这里需要根据实际情况配置代理
        // 如果不需要代理，可以注释掉以下代码
        // System.setProperty("http.proxyHost", "127.0.0.1");
        // System.setProperty("http.proxyPort", "7890");
        // System.setProperty("https.proxyHost", "127.0.0.1");
        // System.setProperty("https.proxyPort", "7890");

        Document doc = Jsoup.connect(url)
                .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
                .timeout(10000)
                .get();

        // 解析标题和演员信息
        Element h3Element = doc.select("h3").first();
        if (h3Element != null) {
            fileIndex.setTitle(h3Element.ownText());

            Element smallElement = h3Element.select("small").first();
            if (smallElement != null && smallElement.text() != null && !smallElement.text().isEmpty()) {
                String[] split = smallElement.text().split(" ");
                if (split.length > 0) {
                    fileIndex.setCode(split[0]);
                }
                if (split.length > 1) {
                    fileIndex.setPerformer(split[1]);
                }
            }
        }

        // 解析封面图片
        Element targetDiv = doc.select("div.col-xs-12.col-md-12").first();
        if (targetDiv != null) {
            Element firstImg = targetDiv.select("img").first();
            if (firstImg != null) {
                fileIndex.setCover(firstImg.attr("src"));
            }
        }

        log.info("刮削成功，编号={}, 标题={}, 演员={}", fileIndex.getCode(), fileIndex.getTitle(), fileIndex.getPerformer());
    }
}
